package com.ssh.dao;
import java.io.Serializable;
import java.util.List;

import com.ssh.common.util.Page;



/**
 * 通用dao接口定义
 * @author laohuidi
 *
 */
public interface IDao {


	public Long countByNativeSTName(String stname, List parameters);

	public Long countByNativeSTName(String stname, Object[] parameters);
/*
	* @author laohuidi
	* @version 2.0
	* @param
	* @return
	 */
	
	/**saveOrUpdateDomain<br/>
	 * 更新或是保存域对象<br/>
	 * @param <T>
	 * @param domain
	 * @return T
	 * @exception 
	 * @since  1.0.0
	 */
	public <T> T saveOrUpdateDomain(T domain);

	/** countAll<br/>
	 * 通过sql语句计算所有的数据库数量<br/>
	 * @param sql
	 * @param paramValues
	 * @return int
	 * @exception 
	 * @since  1.0.0
	 */
	public int countAll(String sql,Object[] paramValues);
	
	/**
	 * 查询传入的条件的总数
	 * 使用命名查询的方式
	 * @param stname 统计数量的语句命名
	 * @param paramValues 参数集合，没有的话传null
	 * @return
	 */
	public Long countBySTName(String stname,List paramValues);

	/**
	 * 查询传入的条件的总数
	 * 使用命名查询的方式
	 * @param stname 统计数量的语句命名
	 * @param paramValues 参数集合，没有的话传null
	 * @param setToCache 是否设置进设置进缓存中
	 * @param findFromCache 是否先从缓存中获取
	 * @return
	 */
	public Long countBySTName(String stname,Object[] paramValues);

	/**
	 * 获取一个实体对象
	 * @param <T>
	 * @param object 仅作泛型检查，无实际意义
	 * @param id
	 * @return null出现异常
	 */
	public <T> T getDomain(T object,Serializable id);

	/**
	 * 获取一个实体对象
	 * @param <T>
	 * @param object 仅作泛型检查，无实际意义
	 * @param id
	 * @return null出现异常
	 */
	public <T> T getDomain(Class<T> clazz,Serializable id);

	/**
	 * 查询一个数据库对象
	 * @param stname
	 * @param parameters 参数集合，没有的话传null
	 * @return
	 */
	public Object findOneBySTName(String stname, Object[] parameters);

	/**
	 * 查询一个数据库对象
	 * @param stname
	 * @param parameters 参数集合，没有的话传null
	 * @return
	 */
	public Object findOneBySTName(String stname, List parameters);

	/**
	 * 查询一个数据库对象，使用原生的查询语句
	 * @param stname
	 * @param parameters 参数集合，没有的话传null
	 * @return
	 */
	public Object findOneByNativeSTName(String stname, Object[] parameters);

	/**
	 * 查询一个数据库对象，使用原生的查询语句
	 * @param stname
	 * @param parameters 参数集合，没有的话传null
	 * @return
	 */
	public Object findOneByNativeSTName(String stname,List parameters);

	/**
	 * 根据命名查询一批数据库记录
	 * @param stname
	 * @param parameters
	 * @param setToCache 是否设置进设置进缓存中
	 * @param findFromCache 是否先从缓存中获取
	 * @param start 查询的起点索引 <=0表示从头开始
	 * @param size 查询的最大数量 <0表示查询全部
	 * @return
	 */
    public List<?> findListBySTName(String stname, Object[] parameters,boolean setToCache, boolean findFromCache,long start,long size);

	/**
	 * 根据命名查询一批数据库记录
	 * @param stname
	 * @param parameters
	 * @param setToCache 是否设置进设置进缓存中
	 * @param findFromCache 是否先从缓存中获取
	 * @param start 查询的起点索引 <=0表示从头开始
	 * @param size 查询的最大数量 <0表示查询全部
	 * @return
	 */
    public List<?> findListBySTName(String stname, List parameters,boolean setToCache, boolean findFromCache,long start,long size);


	/**
	 * 根据命名查询一批数据库记录，使用原生的查询语句
	 * @param stname
	 * @param parameters
	 * @param setToCache 是否设置进设置进缓存中
	 * @param findFromCache 是否先从缓存中获取
	 * @param start 查询的起点索引 <=0表示从头开始
	 * @param size 查询的最大数量 <0表示查询全部
	 * @return
	 */
    public List<?> findListByNativeSTName(String stname, Object[] parameters,boolean setToCache, boolean findFromCache,long start,long size);

	/**
	 * 根据命名查询一批数据库记录，使用原生的查询语句
	 * @param stname
	 * @param parameters
	 * @param setToCache 是否设置进设置进缓存中
	 * @param findFromCache 是否先从缓存中获取
	 * @param start 查询的起点索引 <=0表示从头开始.起点从0开始
	 * @param size 查询的最大数量 <0表示查询全部
	 * @return
	 */
    public List<?> findListByNativeSTName(String stname, List parameters,boolean setToCache, boolean findFromCache,long start,long size);


    /**
     * 持久化一个数据，实现添加或更新
     * @param <T>
     * @param domain
     * @return null出现异常 ，否则返回添加完成的数据
     */
	public <T> T saveDomain(T object);

	/**
	 * 根据命名的语句修改数据库，传入语句和参数
	 * @param stname
	 * @param parameters
	 * @return
	 */
	public  int executeBySTName(String stname,Object[] parameters);

	/**
	 * 根据命名的语句修改数据库，传入语句和参数
	 * @param stname
	 * @param parameters
	 * @return
	 */
	public  int executeBySTName(String stname,List parameters);

	/**
	 * 根据id删除一条数据库记录
	 * @param id
	 * @return
	 */
	public boolean deleteDomain(Class<?> clazz,Serializable id);

	/**
	 * 根据id删除一条数据库记录
	 * @param id
	 * @return
	 */
	public boolean deleteDomain(Object persistentObj);


	/**
	 * 执行存储过程
	 * @param stname
	 * @param parameters
	 * @return
	 */
	public List executeProcByName(String stname,Object[] parameters);


	/**
	 * 分页查询数据,page.curStartIndex <=0从头开始查询，page.numberPerPage<0查询全部
	 * @param stName 查询语句
	 * @param countStName 计算总数语句
	 * @param params 查询参数
	 * @param page 页面数据
	 * @param countPage 是否要计算页面内容，及查询总数等
	 * @param isNaviteSqlName 是否是本地的查询语句
	 * @return -1查询失败 0查询成功
	 */
	public int queryIntoPage(String stName,String countStName,Object[] params,Page page,boolean countPage,boolean isNaviteSqlName);


	/**
	 *
	 * @param sqlQuery
	 * @param sqlCount
	 * @param params
	 * @param page
	 * @param countPage
	 * @return
	 */
	public int queryIntoPageBySql(String sqlQuery,String sqlCount,List params,Page page,boolean countPage,boolean isNaviteSqlName);

	/**
	 * 根据语句查询数据
	 * @param stname
	 * @param parameters
	 * @param isNativeSql
	 * @param setToCache
	 * @param findFromCache
	 * @param start
	 * @param size
	 * @return
	 */
	public List<?> findListBySql(String stname, List parameters,boolean isNativeSql,
			boolean setToCache, boolean findFromCache, long start, long size) ;

	/**
	 * 根据语句查询数据
	 * @param stname
	 * @param parameters
	 * @param isNativeSql
	 * @param setToCache
	 * @param findFromCache
	 * @param start
	 * @param size
	 * @return
	 */
	public List<?> findListBySql(String stname, Object[] parameters,boolean isNativeSql,
			boolean setToCache, boolean findFromCache, long start, long size) ;

	/**
	 * 根据语句查询实体对象
	 * @param sql
	 * @param parameters
	 * @param isNativeSql
	 * @return
	 */
	public Object findOneBySql(String sql, List parameters,boolean isNativeSql,boolean setToCache, boolean findFromCache);

	/**
	 * 根据语句查询实体对象
	 * @param sql
	 * @param parameters
	 * @param isNativeSql
	 * @return
	 */
	public Object findOneBySql(String sql, Object[] parameters,boolean isNativeSql,boolean setToCache, boolean findFromCache);
}
